package graphviz.MetaModel;

import graphviz.VisiteurGraphique;
import graphviz.MetaModel.enumeration.TypeElementDot;

import java.util.ArrayList;
import java.util.List;

import utils.Utils;

/**
 * Element racine du metaModel Dot
 */
public class ElementDot 
{
	private TypeElementDot type;
	private String titre;
	private List<LigneElementDot> sousElement;
	private String note;
	private List<LiaisonDot> liaison;
	
	/**
	 * Constructeur par default
	 */
	public ElementDot()
	{
		this.titre = null;
		this.sousElement = null;
		this.note = null;
		this.liaison = null;
	}

	/**
	 * Constructeur par recopie
	 */
	public ElementDot(String titre, List<LigneElementDot> sousElement, String note, List<LiaisonDot> liaison) 
	{
		this.titre = titre;
		this.sousElement = sousElement;
		this.note = note;
		this.liaison = liaison;
	}
	
	/**
	 * getter and setter
	 */
	public String getTitre() {return titre;}
	public void setTitre(String titre) {this.titre = titre;}
	
	public List<LigneElementDot> getSousElement() {return sousElement;}
	public void setSousElement(List<LigneElementDot> attribut) {this.sousElement = attribut;}
	public void add(LigneElementDot sousElement)
	{
		if(this.sousElement == null) this.sousElement = new ArrayList<LigneElementDot>();
		this.sousElement.add(sousElement);
	}
	
	public String getNote() {return note;}
	public void setNote(String note) {this.note = note;}

	public List<LiaisonDot> getLiaison() {return liaison;}
	public void setLiaison(List<LiaisonDot> liaison) {this.liaison = liaison;}
	public void add(LiaisonDot liaison)
	{
		if(this.liaison == null) this.liaison = new ArrayList<LiaisonDot>();
		this.liaison.add(liaison);
	}
	
	public TypeElementDot getType() {return type;}
	public void setType(TypeElementDot type) {this.type = type;}
	
	/**
	 * methode Object
	 */
	public boolean equals(Object o)
	{
		if(o == null) return false;
		
		if(o instanceof ElementDot)
		{
			ElementDot objet = (ElementDot) o;
			
			if(!Utils.equals(this.getTitre(), objet.getTitre())) return false;
			if(!Utils.equalsList(this.getSousElement(), objet.getSousElement())) return false;
			if(!Utils.equals(this.getNote(), objet.getNote())) return false;
			if(!Utils.equals(this.getType(), objet.getType())) return false;
			if(!Utils.equalsList(this.getLiaison(), objet.getLiaison())) return false;
			
			return true;
		}
		return false;
	}
	
	/**
	 * visiteur de l'element
	 * @param visiteur le visiteur.
	 */
	public void visite(VisiteurGraphique visiteur)
	{
		if(visiteur != null) visiteur.visite(this);
	}
}
